<?php

class MessageQuery extends Doctrine_Query
{
  protected $is_visible_to_users_joined = false;
  protected $is_user_joined = false;
  protected $is_ticket_joined = false;


  /**
   * Instantiates MessageQuery class
   *
   * @param Doctrine_Connection $conn
   * @param string $class
   * @return UserQuery
   */
  static public function create($conn = null, $class = null)
  {
    return parent::create($conn, 'MessageQuery')->from('Message m')->orderBy('m.created_at ASC');
  }
  

  public function joinTicket()
  {
    if (!$this->is_ticket_joined)
    {
      $this->leftJoin('m.Ticket t');
      $this->is_ticket_joined = true;
    }

    return $this;
  }

  public function joinUser()
  {
    if (!$this->is_user_joined)
    {
      $this->leftJoin('m.User u')->leftJoin('u.User uu')->leftJoin('u.Team ut');
      $this->is_user_joined = true;
    }

    return $this;
  }

  
  public function joinVisibleToUsers()
  {
    if (!$this->is_visible_to_users_joined)
    {
      $this->leftJoin('m.VisibleToUsers vu')->leftJoin('vu.User vuu')->leftJoin('vu.Team vut');
      $this->is_visible_to_users_joined = true;
    }

    return $this;
  }


  public function onlyVisible()
  {
    //Если текущий юзер может управлять любыми тикетами в своих проектах, то фильтр не накладывается
    if (sfContext::getInstance()->getUser()->hasCredential('manage_tickets_in_own_projects'))
      return $this;
      
    //Если текущий юзер может управлять любыми тикетами в любых проектах, то фильтр не накладывается
    if (sfContext::getInstance()->getUser()->hasCredential('manage_tickets_in_all_projects'))
      return $this;
      
      
      //TODO: сделать так, чтобы были видны все пользователи, которым видны сообщения, но
      //при этом оставалась фильтрация по видимости текущему пользователю
      
      
    $user_id=sfContext::getInstance()->getUser()->getGuardUser()->Profile->id;
    $this->leftJoin('m.VisibleToUsers vu2')->andWhere('vu2.id = ?',$user_id);
    return $this;
  }
  
  public function filterById($id)
  {
    return $this->andWhere('m.id = ?',$id);
  }
  
  public function filterByTicketId($ticket_id)
  {
    return $this->andWhere('m.ticket_id = ?',$ticket_id);
  }
  
  
  
}
